package com.maben.udp.test004.server;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioDatagramChannel;

public class NettyServer {
    public static void main(String[] args)throws Exception {
        //Netty 负责装领导的事件处理线程池
        EventLoopGroup threadPool = new NioEventLoopGroup();
        try {
            //服务端启动引导器
            Bootstrap server = new Bootstrap();
            //把事件处理线程池添加进启动引导器
            server.group(threadPool);
            //设置通道的建立方式,这里采用Nio的通道方式来建立请求连接
            server.channel(NioDatagramChannel.class);
            //构造一个由通道处理器构成的通道管道流水线
            server.handler(new MyServerHandler());
            /*
             * 用来配置一些channel的参数，配置的参数会被ChannelConfig使用
             * BACKLOG用于构造服务端套接字ServerSocket对象，
             * 标识当服务器请求处理线程全满时，
             * 用于临时存放已完成三次握手的请求的队列的最大长度。
             * 如果未设置或所设置的值小于1，Java将使用默认值50
             */
            server.option(ChannelOption.SO_BACKLOG, 128);
            /*
             * 是否启用心跳保活机制。在双方TCP套接字建立连接后（即都进入ESTABLISHED状态）
             * 并且在两个小时左右上层没有任何数据传输的情况下，这套机制才会被激活。
             */
            server.option(ChannelOption.SO_KEEPALIVE, true);
            //服务端绑定端口并且开始接收进来的连接请求
            ChannelFuture channelFuture = server.bind(8088).sync();
            //查看一下操作是不是成功结束了
            if (channelFuture.isSuccess()) {
                //如果没有成功结束就处理一些事情,结束了就执行关闭服务端等操作
                System.out.println("server started!");
            }
            //关闭服务端
            channelFuture.channel().closeFuture().sync();
            System.out.println("server is stopping!");
        } finally {
            //关闭事件处理组
            threadPool.shutdownGracefully();
            System.out.println("server stopped!");
        }
    }
}
